perm filename O[GEO,BGB] blob
sn#026246 filedate 1973-03-07 generic text, type T, neo UTF8
00100 SUBR(XSORT)S0-----------------------------------------------------
00200 BEGIN XSORT; SPLIT WINDOW W0 INTO TWO WINDOWS W1 AND W2.
00300 ;BGB - 25 FEBRUARY 1973.
00400 ;IF (XH-XL) ≤ 1.0 THEN RETURN.
00500 ;DECLIP
00600 ;IF NCNT ≤ EDGCNT THEN ESCAN & RETURN.
00700 ; XMID ← (XL+XH)/2
00800 L1: SETZB E,1↔EXCH E,(S0)↔JUMPE E,L2
00900 NVT V,E↔CAMLE XMID,XPP(V)↔IORI 1,1 ;NVT IN 0=W1 OR 1=W2.
01000 PVT V,E↔CAMLE XMID,XPP(V)↔IORI 1,2 ;PVT IN 0=W1 OR 2=W2.
01100 GO@[SIDE1↔.+1↔.+1↔SIDE2](1)
01200
01300 ;EDGE CROSSES MID LINE.
01400 LACN AA(E)↔FMP XMID ;YMID ← -(A*XMID+C)/B.
01500 FSB CC(E)↔FDV BB(E) ;MIDDLE CROSSING Y-LEVEL.
01600
01700 ;SKIP WHEN CROSSING IS ABOVE YL.
01800 ;EXECUTE WHEN CROSSING IS BELOW WINDOW.
01900 CAMGE 0,YL↔GO[
02000 CAMGE 0,YPP(V) ;SKIP Y CROSSING ABOVE PVT.
02100
02200 ;CROSSING BELOW PVT, E IN PVT'S SIDE.
02300 GO@[SIDE1↔SIDE1↔SIDE2↔SIDE2](1)
02400
02500 ;CROSSING ABOVE PVT, E IN NVT'S SIDE.
02600 GO@[SIDE1↔SIDE2↔SIDE1↔SIDE2](1)
02700 ]
02800 ;SKIP WHEN CROSSING IS BELOW YH.
02900 ;EXECUTE WHEN CROSSING IS ABOVE WINDOW.
03000 CAMLE 0,YH↔GO[
03100 CAMLE 0,YPP(V) ;SKIP Y CROSSING IS BELOW PVT.
03200
03300 ;CROSSING ABOVE PVT, E IN NVT'S SIDE.
03400 GO@[SIDE1↔SIDE2↔SIDE1↔SIDE2](1)
03500
03600 ;CROSSING BELOW PVT, E IN PVT'S SIDE.
03700 GO@[SIDE1↔SIDE1↔SIDE2↔SIDE2](1)
03800 ]
03900 ;EDGE IS IN BOTH SIDE1 AND SIDE2.
04000 DIP E,E↔DAC E,(S0)
04100 AOS S1↔AOJA S2,L2
04200 ;EDGE IS ONLY IN ONE SIDE OR THE OTHER.
04300 SIDE1: DIPZ E,(S0)↔AOJA S1,L2
04400 SIDE2: DAPZ E,(S0)↔AOJA S2,L2
04500 L2: AOBJN S0,L1
04600
04700 ; DAC S2,-5(P)
04800 ; DAC XMID,-4(P)
04900 PUSH P,S1
05000 CALL(YSORT,XL,XMID,YL,YH)
05100 GO XSORT
05200 BEND
00100 ;CLIP DETECTOR - MIDPOINT METHOD.
00200
00300 CAML Y1,YH↔IORI C1,8 ;NORTH.
00400 CAMG Y1,YL↔IORI C1,4 ;SOUTH.
00500 CAML X1,XH↔IORI C1,2 ;EAST.
00600 CAMG X1,XL↔IORI C1,1 ;WEST.
00700 JUMPE C1,INSIDER
00800
00900 CAML Y2,YH↔IORI C2,8 ;NORTH.
01000 CAMG Y2,YL↔IORI C2,4 ;SOUTH.
01100 CAML X2,XH↔IORI C2,2 ;EAST.
01200 CAMG X2,XL↔IORI C2,1 ;WEST.
01300 JUMPE C2,INSIDER
01400
01500 TDNE C1,C2 ;WHEN V1 & V2 ARE BEYOND THE WINDOW
01600 GO OUTSIDER ;IN THE SAME DIRECTION - EASY OUT.
01700
01800 L: LAC X,X1↔ADD X,X2↔ASH X,-1 ;MIDPOINT.
01900 LAC Y,Y1↔ADD Y,Y2↔ASH Y,-1
02000
02100 CAML Y0,YH↔IORI C0,8 ;NORTH.
02200 CAMG Y0,YL↔IORI C0,4 ;SOUTH.
02300 CAML X0,XH↔IORI C0,2 ;EAST.
02400 CAMG X0,XL↔IORI C0,1 ;WEST.
02500 JUMPE C0,INSIDER
02600
02700 TDNE C0,C1
02800 GO .+5 ;FIRST HALF EASY OUT.
02900 LAC C2,C0 ;FIRST HALF STILL IN DOUBT.
03000 LAC X2,X0
03100 LAC Y2,Y0↔GO L
03200
03300 TDNE C0,C2
03400 GO OUTSIDER ;BOTH HALVES EASY OUT.
03500 LAC C1,C0 ;SECOND HALF STILL IN DOUBT.
03600 LAC X1,X0
03700 LAC Y1,Y0↔GO L